# -*- codnig: utf8 -*-
import math

class IS_PESEL:
    def __call__(self, val):
        if len(val)<11:
            return (val, "Niepoprawny format - zbyt malo cyfr")
        elif len(val)>11:
            return (val, "Niepoprawny format - zbyt duzo cyfr")
        elif not val.isdigit():
           return (val, "Niepoprawny format. Powinny być tylko cyfry")
        else :
            return (val, None)
    
class IS_NIP:
    def __call__(self, val):
        if len(val)<10:
            return (val, "Niepoprawny format - zbyt malo cyfr")
        elif len(val)>10:
            return (val, "Niepoprawny format - zbyt duzo cyfr")
        elif not val.isdigit():
           return (val, "Niepoprawny format. Powinny być tylko cyfry")
        else :
            return (val, None)
    
class IS_ZIP:
    def __call__(self, val):
        if len(val)!=6:
            return (val, "Niepoprawny format - zbyt malo cyfr")
        elif not (val[:2].isdigit() and  val[3:].isdigit() and val[2]=='-'):
           return (val, "Niepoprawny format. Powinny być dd-ddd, gdzie d oznacza cyfra")
        else :
            return (val, None)
 
class IS_SEX:
	def __call__(self, val):
		if val=='0' or val=='1':
			return (val, None)
		else :
			return (val, "Niepoprawne wejście. Wpisz 0 lub 1")

class IS_FIRST_UPPER:
	def __call__(self, val):
		if len(val) > 0:
			return (val[0].upper() + val[1:].lower(), None)
		else :
			return (val, "Zbyt mało liter")


"""
Table definition
"""
db.define_table("tyt_nauk",
      SQLField("nazwa", "string", length=8, notnull=True, unique=True))


"""
Table definition
"""
db.define_table("form_zatr",
      SQLField("nazwa", "string", length=20, notnull=True, unique=True))


"""
Table definition
"""
db.define_table("instytut",
      SQLField("nazwa", "string", notnull=True, unique=True))


"""
Table definition
"""
db.define_table("dyscyplina",
      SQLField("nazwa", "string", notnull=True, unique=True))


"""
Table definition
"""
db.define_table("czas_pracy",
      SQLField("nazwa", "string", length=40, notnull=True, unique=True))


"""
Table definition
"""
db.define_table("zaklad",
      SQLField("nazwa", "string", length=12, notnull=True, unique=True))



"""
Table definition
"""
db.define_table("pracownicy",
      SQLField("imie", "string", length=24, notnull=True, required=True, label='Imię', requires=IS_FIRST_UPPER()),
      SQLField("nazwisko", "string", length=24, notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("plec", "integer", label='Płeć',comment="0-kobieta, 1-mężczyzna", requires=IS_SEX()),
      SQLField("id_tyt_nauk", db.tyt_nauk, label="Tytuł naukowy"),
      SQLField("pesel", "string", length=11, notnull=True, unique=True, required=True),
      SQLField("nip", "integer", notnull=True, required=True, requires=IS_NIP()),
      SQLField("imie_ojca", "string", label="Imię ojca", length=20, notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("imie_matki", "string", label="Imię matki", length=20, notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("data_ur", "date", label="Data urodzenia", notnull=True, required=True, requires=IS_DATE(error_message='Nieprawidłowa data'), comment="poprawny format: RRRR-MM-DD"),
      SQLField("miejsce_ur", "string", label="Miejsce urodzenia", notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("miejscowosc", "string", label="Miejscowość", notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("kod_pocztowy", "string", length=6, notnull=True, required=True, requires=IS_ZIP(), comment="poprawny format dd-ddd"),
      SQLField("ulica", "string", notnull=True, required=True,requires=IS_FIRST_UPPER()),
      SQLField("nr_domu", "string", required=False),
      SQLField("nr_mieszkania", "string", required=False),
      SQLField("kraj", "string", notnull=True, required=True, requires=IS_FIRST_UPPER()),
      SQLField("email", "string", required=True),
      SQLField("id_czas_pracy",  db.czas_pracy, label="Czas pracy", required=True),
      SQLField("id_form_zatr", db.form_zatr, label="Forma zatrudnienia", required=True),
      SQLField("id_instytut", db.instytut, label="Instytut",  required=True),
      SQLField("id_zaklad", db.zaklad, label="Zakład", required=True),
      SQLField("id_dyscyplina", db.dyscyplina, label="Dyscyplina" ),
      SQLField("specjalnosc", "string", label="Specjalność", length=40)   )


"""
Relations between tables (remove fields you don't need from requires)
"""
db.pracownicy.id_tyt_nauk.requires=IS_IN_DB(db, 'tyt_nauk.id','tyt_nauk.nazwa')
db.pracownicy.pesel.requires=[IS_NOT_IN_DB(db, 'pracownicy.pesel', "podany pesel już występuje w bazie"), IS_PESEL()]
db.pracownicy.id_czas_pracy.requires=IS_IN_DB(db, 'czas_pracy.id','czas_pracy.nazwa')
db.pracownicy.id_form_zatr.requires=IS_IN_DB(db, 'form_zatr.id','form_zatr.nazwa')
db.pracownicy.id_instytut.requires=IS_IN_DB(db, 'instytut.id','instytut.nazwa')
db.pracownicy.id_zaklad.requires=IS_IN_DB(db, 'zaklad.id','zaklad.nazwa')
db.pracownicy.id_dyscyplina.requires=IS_IN_DB(db, 'dyscyplina.id','dyscyplina.nazwa')
db.pracownicy.email.requires=[IS_EMAIL("nieprawidłowy email"), IS_NOT_IN_DB(db, 'pracownicy.email', "podany email już występuje w bazie")]

	
#listy pól dostępnych na rożnych poziomach autoryzacji (wyswietla w takiej kolejnosci
pracownik_all=['imie','nazwisko','id_tyt_nauk','id_czas_pracy','id_form_zatr','id_instytut','id_zaklad','id_dyscyplina','specjalnosc','pesel','nip','imie_ojca','imie_matki','data_ur','miejsce_ur','miejscowosc','kod_pocztowy','ulica','nr_domu','nr_mieszkania','kraj', 'email']
pracownik_zmiana_prac=['imie','nazwisko','id_tyt_nauk', 'id_czas_pracy','id_form_zatr','id_instytut','id_zaklad','id_dyscyplina']
pracownik_black=['imie','nazwisko','id_tyt_nauk', 'email', 'id_czas_pracy','id_form_zatr','id_instytut','id_zaklad','id_dyscyplina','specjalnosc']
pracownik_red=['pesel','nip','imie_ojca','imie_matki','data_ur','miejsce_ur','miejscowosc','kod_pocztowy','ulica','nr_domu','nr_mieszkania','kraj']
pracownik_lista=['id_tyt_nauk','imie','nazwisko','id_instytut', 'email']
#pracownik_fields_black=map(lambda f : db.pracownicy[f],pracownik_black)
#pracownik_fields_red=map(lambda f : db.pracownicy[f],pracownik_red)
pracownik_fields_all=map(lambda f : db.pracownicy[f],pracownik_all)
pracownik_fields_lista=map(lambda f : db.pracownicy[f],pracownik_lista)
